home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / Debugger.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  16KB  |  550 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. import os
  5. import bdb
  6. import types
  7. from Tkinter import *
  8. from WindowList import ListedToplevel
  9. from ScrolledList import ScrolledList
  10.  
  11. class Idb(bdb.Bdb):
  12.     
  13.     def __init__(self, gui):
  14.         self.gui = gui
  15.         bdb.Bdb.__init__(self)
  16.  
  17.     
  18.     def user_line(self, frame):
  19.         if self.in_rpc_code(frame):
  20.             self.set_step()
  21.             return None
  22.         
  23.         message = self._Idb__frame2message(frame)
  24.         self.gui.interaction(message, frame)
  25.  
  26.     
  27.     def user_exception(self, frame, info):
  28.         if self.in_rpc_code(frame):
  29.             self.set_step()
  30.             return None
  31.         
  32.         message = self._Idb__frame2message(frame)
  33.         self.gui.interaction(message, frame, info)
  34.  
  35.     
  36.     def in_rpc_code(self, frame):
  37.         if frame.f_code.co_filename.count('rpc.py'):
  38.             return True
  39.         else:
  40.             prev_frame = frame.f_back
  41.             if prev_frame.f_code.co_filename.count('Debugger.py'):
  42.                 return False
  43.             
  44.             return self.in_rpc_code(prev_frame)
  45.  
  46.     
  47.     def __frame2message(self, frame):
  48.         code = frame.f_code
  49.         filename = code.co_filename
  50.         lineno = frame.f_lineno
  51.         basename = os.path.basename(filename)
  52.         message = '%s:%s' % (basename, lineno)
  53.         if code.co_name != '?':
  54.             message = '%s: %s()' % (message, code.co_name)
  55.         
  56.         return message
  57.  
  58.  
  59.  
  60. class Debugger:
  61.     vstack = None
  62.     vsource = None
  63.     vlocals = None
  64.     vglobals = None
  65.     
  66.     def __init__(self, pyshell, idb = None):
  67.         if idb is None:
  68.             idb = Idb(self)
  69.         
  70.         self.pyshell = pyshell
  71.         self.idb = idb
  72.         self.frame = None
  73.         self.make_gui()
  74.         self.interacting = 0
  75.  
  76.     
  77.     def run(self, *args):
  78.         
  79.         try:
  80.             self.interacting = 1
  81.             return self.idb.run(*args)
  82.         finally:
  83.             self.interacting = 0
  84.  
  85.  
  86.     
  87.     def close(self, event = None):
  88.         if self.interacting:
  89.             self.top.bell()
  90.             return None
  91.         
  92.         if self.stackviewer:
  93.             self.stackviewer.close()
  94.             self.stackviewer = None
  95.         
  96.         self.pyshell.close_debugger()
  97.         self.top.destroy()
  98.  
  99.     
  100.     def make_gui(self):
  101.         pyshell = self.pyshell
  102.         self.flist = pyshell.flist
  103.         self.root = root = pyshell.root
  104.         self.top = top = ListedToplevel(root)
  105.         self.top.wm_title('Debug Control')
  106.         self.top.wm_iconname('Debug')
  107.         top.wm_protocol('WM_DELETE_WINDOW', self.close)
  108.         self.top.bind('<Escape>', self.close)
  109.         self.bframe = bframe = Frame(top)
  110.         self.bframe.pack(anchor = 'w')
  111.         self.buttons = bl = []
  112.         self.bcont = b = Button(bframe, text = 'Go', command = self.cont)
  113.         bl.append(b)
  114.         self.bstep = b = Button(bframe, text = 'Step', command = self.step)
  115.         bl.append(b)
  116.         self.bnext = b = Button(bframe, text = 'Over', command = self.next)
  117.         bl.append(b)
  118.         self.bret = b = Button(bframe, text = 'Out', command = self.ret)
  119.         bl.append(b)
  120.         self.bret = b = Button(bframe, text = 'Quit', command = self.quit)
  121.         bl.append(b)
  122.         for b in bl:
  123.             b.configure(state = 'disabled')
  124.             b.pack(side = 'left')
  125.         
  126.         self.cframe = cframe = Frame(bframe)
  127.         self.cframe.pack(side = 'left')
  128.         if not self.vstack:
  129.             self.__class__.vstack = BooleanVar(top)
  130.             self.vstack.set(1)
  131.         
  132.         self.bstack = Checkbutton(cframe, text = 'Stack', command = self.show_stack, variable = self.vstack)
  133.         self.bstack.grid(row = 0, column = 0)
  134.         if not self.vsource:
  135.             self.__class__.vsource = BooleanVar(top)
  136.         
  137.         self.bsource = Checkbutton(cframe, text = 'Source', command = self.show_source, variable = self.vsource)
  138.         self.bsource.grid(row = 0, column = 1)
  139.         if not self.vlocals:
  140.             self.__class__.vlocals = BooleanVar(top)
  141.             self.vlocals.set(1)
  142.         
  143.         self.blocals = Checkbutton(cframe, text = 'Locals', command = self.show_locals, variable = self.vlocals)
  144.         self.blocals.grid(row = 1, column = 0)
  145.         if not self.vglobals:
  146.             self.__class__.vglobals = BooleanVar(top)
  147.         
  148.         self.bglobals = Checkbutton(cframe, text = 'Globals', command = self.show_globals, variable = self.vglobals)
  149.         self.bglobals.grid(row = 1, column = 1)
  150.         self.status = Label(top, anchor = 'w')
  151.         self.status.pack(anchor = 'w')
  152.         self.error = Label(top, anchor = 'w')
  153.         self.error.pack(anchor = 'w', fill = 'x')
  154.         self.errorbg = self.error.cget('background')
  155.         self.fstack = Frame(top, height = 1)
  156.         self.fstack.pack(expand = 1, fill = 'both')
  157.         self.flocals = Frame(top)
  158.         self.flocals.pack(expand = 1, fill = 'both')
  159.         self.fglobals = Frame(top, height = 1)
  160.         self.fglobals.pack(expand = 1, fill = 'both')
  161.         if self.vstack.get():
  162.             self.show_stack()
  163.         
  164.         if self.vlocals.get():
  165.             self.show_locals()
  166.         
  167.         if self.vglobals.get():
  168.             self.show_globals()
  169.         
  170.  
  171.     
  172.     def interaction(self, message, frame, info = None):
  173.         self.frame = frame
  174.         self.status.configure(text = message)
  175.         if info:
  176.             (type, value, tb) = info
  177.             
  178.             try:
  179.                 m1 = type.__name__
  180.             except AttributeError:
  181.                 m1 = '%s' % str(type)
  182.  
  183.             if value is not None:
  184.                 
  185.                 try:
  186.                     m1 = '%s: %s' % (m1, str(value))
  187.  
  188.             
  189.             bg = 'yellow'
  190.         else:
  191.             m1 = ''
  192.             tb = None
  193.             bg = self.errorbg
  194.         self.error.configure(text = m1, background = bg)
  195.         sv = self.stackviewer
  196.         if sv:
  197.             (stack, i) = self.idb.get_stack(self.frame, tb)
  198.             sv.load_stack(stack, i)
  199.         
  200.         self.show_variables(1)
  201.         if self.vsource.get():
  202.             self.sync_source_line()
  203.         
  204.         for b in self.buttons:
  205.             b.configure(state = 'normal')
  206.         
  207.         self.top.wakeup()
  208.         self.root.mainloop()
  209.         for b in self.buttons:
  210.             b.configure(state = 'disabled')
  211.         
  212.         self.status.configure(text = '')
  213.         self.error.configure(text = '', background = self.errorbg)
  214.         self.frame = None
  215.  
  216.     
  217.     def sync_source_line(self):
  218.         frame = self.frame
  219.         if not frame:
  220.             return None
  221.         
  222.         (filename, lineno) = self._Debugger__frame2fileline(frame)
  223.         if filename[:1] + filename[-1:] != '<>' and os.path.exists(filename):
  224.             self.flist.gotofileline(filename, lineno)
  225.         
  226.  
  227.     
  228.     def __frame2fileline(self, frame):
  229.         code = frame.f_code
  230.         filename = code.co_filename
  231.         lineno = frame.f_lineno
  232.         return (filename, lineno)
  233.  
  234.     
  235.     def cont(self):
  236.         self.idb.set_continue()
  237.         self.root.quit()
  238.  
  239.     
  240.     def step(self):
  241.         self.idb.set_step()
  242.         self.root.quit()
  243.  
  244.     
  245.     def next(self):
  246.         self.idb.set_next(self.frame)
  247.         self.root.quit()
  248.  
  249.     
  250.     def ret(self):
  251.         self.idb.set_return(self.frame)
  252.         self.root.quit()
  253.  
  254.     
  255.     def quit(self):
  256.         self.idb.set_quit()
  257.         self.root.quit()
  258.  
  259.     stackviewer = None
  260.     
  261.     def show_stack(self):
  262.         if not (self.stackviewer) and self.vstack.get():
  263.             self.stackviewer = sv = StackViewer(self.fstack, self.flist, self)
  264.             if self.frame:
  265.                 (stack, i) = self.idb.get_stack(self.frame, None)
  266.                 sv.load_stack(stack, i)
  267.             
  268.         else:
  269.             sv = self.stackviewer
  270.             if sv and not self.vstack.get():
  271.                 self.stackviewer = None
  272.                 sv.close()
  273.             
  274.             self.fstack['height'] = 1
  275.  
  276.     
  277.     def show_source(self):
  278.         if self.vsource.get():
  279.             self.sync_source_line()
  280.         
  281.  
  282.     
  283.     def show_frame(self, .2):
  284.         (frame, lineno) = .2
  285.         self.frame = frame
  286.         self.show_variables()
  287.  
  288.     localsviewer = None
  289.     globalsviewer = None
  290.     
  291.     def show_locals(self):
  292.         lv = self.localsviewer
  293.         if self.vlocals.get():
  294.             if not lv:
  295.                 self.localsviewer = NamespaceViewer(self.flocals, 'Locals')
  296.             
  297.         elif lv:
  298.             self.localsviewer = None
  299.             lv.close()
  300.             self.flocals['height'] = 1
  301.         
  302.         self.show_variables()
  303.  
  304.     
  305.     def show_globals(self):
  306.         gv = self.globalsviewer
  307.         if self.vglobals.get():
  308.             if not gv:
  309.                 self.globalsviewer = NamespaceViewer(self.fglobals, 'Globals')
  310.             
  311.         elif gv:
  312.             self.globalsviewer = None
  313.             gv.close()
  314.             self.fglobals['height'] = 1
  315.         
  316.         self.show_variables()
  317.  
  318.     
  319.     def show_variables(self, force = 0):
  320.         lv = self.localsviewer
  321.         gv = self.globalsviewer
  322.         frame = self.frame
  323.         if not frame:
  324.             ldict = None
  325.             gdict = None
  326.         else:
  327.             ldict = frame.f_locals
  328.             gdict = frame.f_globals
  329.             if lv and gv and ldict is gdict:
  330.                 ldict = None
  331.             
  332.         if lv:
  333.             lv.load_dict(ldict, force, self.pyshell.interp.rpcclt)
  334.         
  335.         if gv:
  336.             gv.load_dict(gdict, force, self.pyshell.interp.rpcclt)
  337.         
  338.  
  339.     
  340.     def set_breakpoint_here(self, filename, lineno):
  341.         self.idb.set_break(filename, lineno)
  342.  
  343.     
  344.     def clear_breakpoint_here(self, filename, lineno):
  345.         self.idb.clear_break(filename, lineno)
  346.  
  347.     
  348.     def clear_file_breaks(self, filename):
  349.         self.idb.clear_all_file_breaks(filename)
  350.  
  351.     
  352.     def load_breakpoints(self):
  353.         '''Load PyShellEditorWindow breakpoints into subprocess debugger'''
  354.         pyshell_edit_windows = self.pyshell.flist.inversedict.keys()
  355.         for editwin in pyshell_edit_windows:
  356.             filename = editwin.io.filename
  357.             
  358.             try:
  359.                 for lineno in editwin.breakpoints:
  360.                     self.set_breakpoint_here(filename, lineno)
  361.             continue
  362.             except AttributeError:
  363.                 continue
  364.                 continue
  365.             
  366.  
  367.         
  368.  
  369.  
  370.  
  371. class StackViewer(ScrolledList):
  372.     
  373.     def __init__(self, master, flist, gui):
  374.         ScrolledList.__init__(self, master, width = 80)
  375.         self.flist = flist
  376.         self.gui = gui
  377.         self.stack = []
  378.  
  379.     
  380.     def load_stack(self, stack, index = None):
  381.         self.stack = stack
  382.         self.clear()
  383.         for i in range(len(stack)):
  384.             (frame, lineno) = stack[i]
  385.             
  386.             try:
  387.                 modname = frame.f_globals['__name__']
  388.             except:
  389.                 modname = '?'
  390.  
  391.             code = frame.f_code
  392.             filename = code.co_filename
  393.             funcname = code.co_name
  394.             import linecache as linecache
  395.             sourceline = linecache.getline(filename, lineno)
  396.             import string as string
  397.             sourceline = string.strip(sourceline)
  398.             if funcname in ('?', '', None):
  399.                 item = '%s, line %d: %s' % (modname, lineno, sourceline)
  400.             else:
  401.                 item = '%s.%s(), line %d: %s' % (modname, funcname, lineno, sourceline)
  402.             if i == index:
  403.                 item = '> ' + item
  404.             
  405.             self.append(item)
  406.         
  407.         if index is not None:
  408.             self.select(index)
  409.         
  410.  
  411.     
  412.     def popup_event(self, event):
  413.         '''override base method'''
  414.         if self.stack:
  415.             return ScrolledList.popup_event(self, event)
  416.         
  417.  
  418.     
  419.     def fill_menu(self):
  420.         '''override base method'''
  421.         menu = self.menu
  422.         menu.add_command(label = 'Go to source line', command = self.goto_source_line)
  423.         menu.add_command(label = 'Show stack frame', command = self.show_stack_frame)
  424.  
  425.     
  426.     def on_select(self, index):
  427.         '''override base method'''
  428.         if index <= index:
  429.             pass
  430.         elif index < len(self.stack):
  431.             self.gui.show_frame(self.stack[index])
  432.         
  433.  
  434.     
  435.     def on_double(self, index):
  436.         '''override base method'''
  437.         self.show_source(index)
  438.  
  439.     
  440.     def goto_source_line(self):
  441.         index = self.listbox.index('active')
  442.         self.show_source(index)
  443.  
  444.     
  445.     def show_stack_frame(self):
  446.         index = self.listbox.index('active')
  447.         if index <= index:
  448.             pass
  449.         elif index < len(self.stack):
  450.             self.gui.show_frame(self.stack[index])
  451.         
  452.  
  453.     
  454.     def show_source(self, index):
  455.         if index <= index:
  456.             pass
  457.         elif not index < len(self.stack):
  458.             return None
  459.         
  460.         (frame, lineno) = self.stack[index]
  461.         code = frame.f_code
  462.         filename = code.co_filename
  463.         if os.path.isfile(filename):
  464.             edit = self.flist.open(filename)
  465.             if edit:
  466.                 edit.gotoline(lineno)
  467.             
  468.         
  469.  
  470.  
  471.  
  472. class NamespaceViewer:
  473.     
  474.     def __init__(self, master, title, dict = None):
  475.         width = 0
  476.         height = 40
  477.         if dict:
  478.             height = 20 * len(dict)
  479.         
  480.         self.master = master
  481.         self.title = title
  482.         import repr as repr
  483.         self.repr = repr.Repr()
  484.         self.repr.maxstring = 60
  485.         self.repr.maxother = 60
  486.         self.frame = frame = Frame(master)
  487.         self.frame.pack(expand = 1, fill = 'both')
  488.         self.label = Label(frame, text = title, borderwidth = 2, relief = 'groove')
  489.         self.label.pack(fill = 'x')
  490.         self.vbar = vbar = Scrollbar(frame, name = 'vbar')
  491.         vbar.pack(side = 'right', fill = 'y')
  492.         self.canvas = canvas = Canvas(frame, height = min(300, max(40, height)), scrollregion = (0, 0, width, height))
  493.         canvas.pack(side = 'left', fill = 'both', expand = 1)
  494.         vbar['command'] = canvas.yview
  495.         canvas['yscrollcommand'] = vbar.set
  496.         self.subframe = subframe = Frame(canvas)
  497.         self.sfid = canvas.create_window(0, 0, window = subframe, anchor = 'nw')
  498.         self.load_dict(dict)
  499.  
  500.     dict = -1
  501.     
  502.     def load_dict(self, dict, force = 0, rpc_client = None):
  503.         if dict is self.dict and not force:
  504.             return None
  505.         
  506.         subframe = self.subframe
  507.         frame = self.frame
  508.         for c in subframe.children.values():
  509.             c.destroy()
  510.         
  511.         self.dict = None
  512.         if not dict:
  513.             l = Label(subframe, text = 'None')
  514.             l.grid(row = 0, column = 0)
  515.         else:
  516.             names = dict.keys()
  517.             names.sort()
  518.             row = 0
  519.             for name in names:
  520.                 value = dict[name]
  521.                 svalue = self.repr.repr(value)
  522.                 if rpc_client:
  523.                     svalue = svalue[1:-1]
  524.                 
  525.                 l = Label(subframe, text = name)
  526.                 l.grid(row = row, column = 0, sticky = 'nw')
  527.                 l = Entry(subframe, width = 0, borderwidth = 0)
  528.                 l.insert(0, svalue)
  529.                 l.grid(row = row, column = 1, sticky = 'nw')
  530.                 row = row + 1
  531.             
  532.         self.dict = dict
  533.         subframe.update_idletasks()
  534.         width = subframe.winfo_reqwidth()
  535.         height = subframe.winfo_reqheight()
  536.         canvas = self.canvas
  537.         self.canvas['scrollregion'] = (0, 0, width, height)
  538.         if height > 300:
  539.             canvas['height'] = 300
  540.             frame.pack(expand = 1)
  541.         else:
  542.             canvas['height'] = height
  543.             frame.pack(expand = 0)
  544.  
  545.     
  546.     def close(self):
  547.         self.frame.destroy()
  548.  
  549.  
  550.